/**
 * 机勘院DeepSeek系统 - 知识库页面JavaScript
 */

// 全局变量
let darkMode = localStorage.getItem('darkMode') === 'true';
let currentView = 'grid'; // 'grid' 或 'list'
let currentTab = 'all-docs';
let editor = null;

$(document).ready(function() {
    // 初始化知识库页面
    initializePage();
    
    // 绑定事件处理
    bindEvents();
});

/**
 * 初始化知识库页面
 */
function initializePage() {
    initializeTooltips();
    initializeSidebar();
    initializeDarkMode();
    initializeEditor();
    initializeEventListeners();
    loadDocuments();
}

/**
 * 初始化工具提示
 */
function initializeTooltips() {
    const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]'));
    tooltipTriggerList.map(function (tooltipTriggerEl) {
        return new bootstrap.Tooltip(tooltipTriggerEl);
    });
}

/**
 * 初始化侧边栏
 */
function initializeSidebar() {
    $('#sidebarToggle').click(function() {
        $('body').toggleClass('sidebar-collapsed');
    });

    $('.deepseek-nav-item').click(function(e) {
        e.preventDefault();
        $('.deepseek-nav-item').removeClass('active');
        $(this).addClass('active');
        
        currentTab = $(this).data('tab');
        loadTabContent(currentTab);
    });
}

/**
 * 初始化暗色模式
 */
function initializeDarkMode() {
    if (darkMode) {
        $('body').addClass('dark-mode');
        $('#toggleDarkMode i').removeClass('fa-moon').addClass('fa-sun');
    }

    $('#toggleDarkMode').click(function() {
        darkMode = !darkMode;
        $('body').toggleClass('dark-mode');
        $(this).find('i').toggleClass('fa-moon fa-sun');
        localStorage.setItem('darkMode', darkMode);
        updateEditorTheme();
    });
}

/**
 * 初始化富文本编辑器
 */
function initializeEditor() {
    tinymce.init({
        selector: '#editor',
        plugins: 'advlist autolink lists link image charmap preview anchor searchreplace visualblocks code fullscreen insertdatetime media table paste help wordcount',
        toolbar: 'undo redo | formatselect | bold italic backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | removeformat | help',
        height: 400,
        skin: darkMode ? 'oxide-dark' : 'oxide',
        content_css: darkMode ? 'dark' : 'default'
    });
}

/**
 * 更新编辑器主题
 */
function updateEditorTheme() {
    if (editor) {
        editor.setTheme(darkMode ? 'oxide-dark' : 'oxide');
        editor.setContent(editor.getContent());
    }
}

/**
 * 初始化事件监听器
 */
function initializeEventListeners() {
    // 视图切换
    $('.btn-group-sm .btn').click(function() {
        $('.btn-group-sm .btn').removeClass('active');
        $(this).addClass('active');
        currentView = $(this).find('i').hasClass('fa-th-large') ? 'grid' : 'list';
        updateView();
    });

    // 排序方式
    $('select.form-select').change(function() {
        const sortBy = $(this).val();
        sortDocuments(sortBy);
    });

    // 搜索
    let searchTimeout;
    $('input[type="text"]').on('input', function() {
        clearTimeout(searchTimeout);
        const searchTerm = $(this).val();
        searchTimeout = setTimeout(() => {
            searchDocuments(searchTerm);
        }, 500);
    });

    // 新建文档
    $('#saveDoc').click(function() {
        saveDocument();
    });

    // 导入文档
    $('#startImport').click(function() {
        importDocuments();
    });

    // 新建分类
    $('#saveCategory').click(function() {
        saveCategory();
    });

    // 文件拖放
    initializeDropZone();
}

/**
 * 初始化拖放区域
 */
function initializeDropZone() {
    const dropZone = $('.upload-area');
    const fileInput = $('#importFile');

    dropZone.on('click', function() {
        fileInput.click();
    });

    dropZone.on('dragover', function(e) {
        e.preventDefault();
        $(this).addClass('dragover');
    });

    dropZone.on('dragleave', function(e) {
        e.preventDefault();
        $(this).removeClass('dragover');
    });

    dropZone.on('drop', function(e) {
        e.preventDefault();
        $(this).removeClass('dragover');
        const files = e.originalEvent.dataTransfer.files;
        handleFiles(files);
    });

    fileInput.on('change', function() {
        handleFiles(this.files);
    });
}

/**
 * 处理文件
 * @param {FileList} files - 文件列表
 */
function handleFiles(files) {
    const validFiles = Array.from(files).filter(file => {
        const validTypes = ['.doc', '.docx', '.pdf', '.md'];
        return validTypes.some(type => file.name.toLowerCase().endsWith(type));
    });

    if (validFiles.length === 0) {
        showToast('warning', '请选择有效的文档文件');
        return;
    }

    // 显示文件列表
    const fileList = validFiles.map(file => `
        <div class="import-file-item mb-2">
            <i class="fas ${getFileIcon(file.name)} me-2"></i>
            <span>${file.name}</span>
            <small class="text-muted ms-2">${formatFileSize(file.size)}</small>
        </div>
    `).join('');

    $('.import-options').before(`
        <div class="selected-files mb-3">
            <h6 class="mb-2">已选择的文件：</h6>
            ${fileList}
        </div>
    `);
}

/**
 * 加载文档列表
 */
function loadDocuments() {
    // 模拟从服务器获取文档列表
    const documents = [
        {
            id: 1,
            title: '道路勘察技术规范v2.0',
            category: '道路勘察',
            tags: ['规范', '技术'],
            updateTime: '2025-03-01',
            views: 128
        },
        {
            id: 2,
            title: '地质勘察报告模板',
            category: '地质分析',
            tags: ['模板', '必读'],
            updateTime: '2025-02-28',
            views: 96
        }
    ];

    updateDocumentList(documents);
}

/**
 * 更新文档列表
 * @param {Array} documents - 文档列表
 */
function updateDocumentList(documents) {
    const container = $('#docGrid');
    container.empty();

    documents.forEach(doc => {
        const docElement = currentView === 'grid' 
            ? createGridDocElement(doc)
            : createListDocElement(doc);
        container.append(docElement);
    });

    // 绑定文档操作事件
    bindDocumentEvents();
}

/**
 * 创建网格视图的文档元素
 * @param {Object} doc - 文档对象
 * @returns {string} - 文档元素的HTML字符串
 */
function createGridDocElement(doc) {
    const tags = doc.tags.map(tag => 
        `<span class="badge bg-${getTagColor(tag)}">${tag}</span>`
    ).join('');

    return `
        <div class="col-md-4">
            <div class="doc-card" data-id="${doc.id}">
                <div class="doc-card-header">
                    <i class="fas fa-file-alt fa-2x text-primary"></i>
                    <div class="dropdown">
                        <button class="btn btn-link" data-bs-toggle="dropdown">
                            <i class="fas fa-ellipsis-v"></i>
                        </button>
                        <ul class="dropdown-menu dropdown-menu-end">
                            <li><a class="dropdown-item" href="#"><i class="fas fa-edit me-2"></i>编辑</a></li>
                            <li><a class="dropdown-item" href="#"><i class="fas fa-star me-2"></i>收藏</a></li>
                            <li><a class="dropdown-item" href="#"><i class="fas fa-share me-2"></i>分享</a></li>
                            <li><hr class="dropdown-divider"></li>
                            <li><a class="dropdown-item text-danger" href="#"><i class="fas fa-trash-alt me-2"></i>删除</a></li>
                        </ul>
                    </div>
                </div>
                <div class="doc-card-body">
                    <h6 class="doc-title">${doc.title}</h6>
                    <p class="doc-meta">
                        <small class="text-muted">
                            <i class="fas fa-clock me-1"></i>${doc.updateTime}
                        </small>
                        <small class="text-muted ms-2">
                            <i class="fas fa-eye me-1"></i>${doc.views}
                        </small>
                    </p>
                    <div class="doc-tags">
                        ${tags}
                    </div>
                </div>
            </div>
        </div>
    `;
}

/**
 * 创建列表视图的文档元素
 * @param {Object} doc - 文档对象
 * @returns {string} - 文档元素的HTML字符串
 */
function createListDocElement(doc) {
    const tags = doc.tags.map(tag => 
        `<span class="badge bg-${getTagColor(tag)}">${tag}</span>`
    ).join('');

    return `
        <div class="list-item d-flex align-items-center p-2 border-bottom" data-id="${doc.id}">
            <div class="doc-icon me-3">
                <i class="fas fa-file-alt text-primary"></i>
            </div>
            <div class="doc-info flex-grow-1">
                <div class="doc-title fw-bold">${doc.title}</div>
                <div class="doc-meta">
                    <small class="text-muted">
                        <i class="fas fa-folder me-1"></i>${doc.category}
                    </small>
                    <small class="text-muted ms-2">
                        <i class="fas fa-clock me-1"></i>${doc.updateTime}
                    </small>
                    <small class="text-muted ms-2">
                        <i class="fas fa-eye me-1"></i>${doc.views}
                    </small>
                </div>
                <div class="doc-tags mt-1">
                    ${tags}
                </div>
            </div>
            <div class="doc-actions">
                <div class="btn-group">
                    <button class="btn btn-sm btn-outline-primary">
                        <i class="fas fa-edit"></i>
                    </button>
                    <button class="btn btn-sm btn-outline-danger">
                        <i class="fas fa-trash-alt"></i>
                    </button>
                </div>
            </div>
        </div>
    `;
}

/**
 * 绑定文档操作事件
 */
function bindDocumentEvents() {
    // 文档点击事件
    $('.doc-card, .list-item').click(function(e) {
        if (!$(e.target).closest('.dropdown-menu, .btn-group').length) {
            const docId = $(this).data('id');
            viewDocument(docId);
        }
    });

    // 编辑按钮
    $('.fa-edit').parent().click(function(e) {
        e.stopPropagation();
        const docId = $(this).closest('[data-id]').data('id');
        editDocument(docId);
    });

    // 删除按钮
    $('.fa-trash-alt').parent().click(function(e) {
        e.stopPropagation();
        const docId = $(this).closest('[data-id]').data('id');
        deleteDocument(docId);
    });
}

/**
 * 获取标签颜色
 * @param {string} tag - 标签
 * @returns {string} - 标签颜色
 */
function getTagColor(tag) {
    const colors = {
        '规范': 'primary',
        '技术': 'info',
        '模板': 'success',
        '必读': 'warning',
        '案例': 'danger'
    };
    return colors[tag] || 'secondary';
}

/**
 * 保存文档
 */
function saveDocument() {
    const form = $('#addDocForm');
    if (!form[0].checkValidity()) {
        form[0].reportValidity();
        return;
    }

    const title = form.find('input[type="text"]').first().val();
    const category = form.find('select').first().val();
    const tags = form.find('input[type="text"]').eq(1).val().split(',').map(t => t.trim());
    const content = tinymce.get('editor').getContent();

    // 在实际应用中，这里应该调用API保存文档
    console.log('保存文档:', { title, category, tags, content });

    $('#addDocModal').modal('hide');
    showToast('success', '文档保存成功');
    
    // 刷新文档列表
    loadDocuments();
}

/**
 * 导入文档
 */
function importDocuments() {
    const extractContent = $('#extractContent').is(':checked');
    const generateTags = $('#generateTags').is(':checked');
    const addToCategory = $('#addToCategory').is(':checked');

    // 在实际应用中，这里应该调用API上传并处理文档
    showToast('success', '文档导入成功');
    $('#importModal').modal('hide');

    // 刷新文档列表
    loadDocuments();
}

/**
 * 保存分类
 */
function saveCategory() {
    const form = $('#addCategoryForm');
    if (!form[0].checkValidity()) {
        form[0].reportValidity();
        return;
    }

    const name = form.find('input[type="text"]').val();
    const parent = form.find('select').val();
    const description = form.find('textarea').val();

    // 在实际应用中，这里应该调用API保存分类
    console.log('保存分类:', { name, parent, description });

    $('#addCategoryModal').modal('hide');
    showToast('success', '分类创建成功');

    // 刷新分类树
    loadCategories();
}

/**
 * 查看文档
 * @param {number} docId - 文档ID
 */
function viewDocument(docId) {
    // 在实际应用中，这里应该调用API获取文档详情
    console.log('查看文档:', docId);
}

/**
 * 编辑文档
 * @param {number} docId - 文档ID
 */
function editDocument(docId) {
    // 在实际应用中，这里应该调用API获取文档详情并填充表单
    console.log('编辑文档:', docId);
    $('#addDocModal').modal('show');
}

/**
 * 删除文档
 * @param {number} docId - 文档ID
 */
function deleteDocument(docId) {
    if (confirm('确定要删除此文档吗？此操作不可恢复。')) {
        // 在实际应用中，这里应该调用API删除文档
        console.log('删除文档:', docId);
        showToast('success', '文档已删除');
        
        // 从列表中移除
        $(`[data-id="${docId}"]`).fadeOut('slow', function() {
            $(this).remove();
        });
    }
}

/**
 * 搜索文档
 * @param {string} term - 搜索关键词
 */
function searchDocuments(term) {
    // 在实际应用中，这里应该调用API搜索文档
    console.log('搜索文档:', term);
}

/**
 * 排序文档
 * @param {string} sortBy - 排序方式
 */
function sortDocuments(sortBy) {
    // 在实际应用中，这里应该调用API获取排序后的文档
    console.log('排序文档:', sortBy);
}

/**
 * 加载分类
 */
function loadCategories() {
    // 在实际应用中，这里应该调用API获取分类列表
    console.log('加载分类');
}

/**
 * 更新视图
 */
function updateView() {
    loadDocuments();
}

/**
 * 加载选项卡内容
 * @param {string} tab - 选项卡名称
 */
function loadTabContent(tab) {
    switch(tab) {
        case 'all-docs':
            loadDocuments();
            break;
        case 'categories':
            loadCategories();
            break;
        case 'tags':
            loadTags();
            break;
        case 'favorites':
            loadFavorites();
            break;
        case 'recycle':
            loadRecycle();
            break;
    }
}

/**
 * 加载标签
 */
function loadTags() {
    // 在实际应用中，这里应该调用API获取标签列表
    console.log('加载标签');
}

/**
 * 加载收藏
 */
function loadFavorites() {
    // 在实际应用中，这里应该调用API获取收藏文档
    console.log('加载收藏');
}

/**
 * 加载回收站
 */
function loadRecycle() {
    // 在实际应用中，这里应该调用API获取回收站文档
    console.log('加载回收站');
}

/**
 * 获取文件图标
 * @param {string} filename - 文件名
 * @returns {string} - 文件图标类名
 */
function getFileIcon(filename) {
    const ext = filename.split('.').pop().toLowerCase();
    switch(ext) {
        case 'doc':
        case 'docx':
            return 'fa-file-word text-primary';
        case 'pdf':
            return 'fa-file-pdf text-danger';
        case 'md':
            return 'fa-file-alt text-success';
        default:
            return 'fa-file text-muted';
    }
}

/**
 * 格式化文件大小
 * @param {number} bytes - 文件大小（字节）
 * @returns {string} - 格式化后的文件大小
 */
function formatFileSize(bytes) {
    if (bytes === 0) return '0 B';
    const k = 1024;
    const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i];
}

/**
 * 显示提示消息
 * @param {string} type - 提示类型（success/info/warning/danger）
 * @param {string} message - 提示消息
 */
function showToast(type, message) {
    const toast = `
        <div class="toast-container position-fixed bottom-0 end-0 p-3">
            <div class="toast align-items-center text-white bg-${type} border-0" role="alert" aria-live="assertive" aria-atomic="true">
                <div class="d-flex">
                    <div class="toast-body">
                        ${message}
                    </div>
                    <button type="button" class="btn-close btn-close-white me-2 m-auto" data-bs-dismiss="toast" aria-label="Close"></button>
                </div>
            </div>
        </div>
    `;

    $('body').append(toast);
    const toastElement = $('.toast').last();
    const bsToast = new bootstrap.Toast(toastElement);
    bsToast.show();

    toastElement.on('hidden.bs.toast', function() {
        $(this).closest('.toast-container').remove();
    });
} 